package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.exception.BusinessRuntimeException;
import com.itheima.pojo.Role;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * 角色组
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    RoleDao roleDao;

    /**
     * 查询所有角色项
     * @return 返回角色的集合
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    /**
     * 分页查询
     * @param pageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean pageBean) {
        PageHelper.startPage(pageBean.getCurrentPage(),pageBean.getPageSize());
        Page<Role> page = roleDao.findByCondition(pageBean.getQueryString());
        return new PageResult(page.getTotal(), page);
    }

    /**
     * 新增角色
     * @param role 要新增的角色对象
     * @param menuIds 关联菜单项中间表对应的菜单项id集合
     */
    @Override
    public void add(Role role, Integer[] menuIds) {
        //新增角色
        roleDao.add(role);
        //创建中间表的关系
        setRelation(role.getId(),menuIds);
    }

    /**
     * 查询一个角色
     * @param id 根据id查询
     * @return 返回查到的角色对象
     */
    @Override
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }

    /**
     * 删除一个角色
     * @param id 根据id删除角色
     */
    @Override
    public void delRoleById(Integer id) {
        /*//查询此id是否被关联
        long count = roleDao.findCountById(id);
        if(count > 0) {
            throw new BusinessRuntimeException("该角色被多项关联，不能删除！！");
        }
        //删除表关系
        delRelation(id);
        //删除角色
        roleDao.delRoleById(id);*/
        //删除表关系
        roleDao.delRoleAndMenuRelation(id);
        //删除角色
        roleDao.delRoleById(id);
    }

    /**
     * 修改角色
     * @param role 修改后的角色对象
     * @param menuIds 中间表关联的菜单项id
     */

    @Override
    public void edit(Role role, Integer[] menuIds) {
        //删除关系
        roleDao.delRoleAndMenuRelation(role.getId());
        //维护新的关系
        setRelation(role.getId(),menuIds);
        //修改角色
        roleDao.edit(role);
    }

    /**
     * 查询中间表中菜单项的id
     * @param id 要查询的角色id
     * @return 返回的是中间表里菜单项关联此id的集合
     */
    @Override
    public List<Integer> findMenuIdsByRoleId(Integer id) {
        return roleDao.findMenuIdsByRoleId(id);
    }

    //创建表关系
    private void setRelation(Integer id, Integer[] arrs) {
        //判断数组是否存在元素
        if(arrs != null && arrs.length > 0){
            //遍历数组
            for (Integer arr : arrs) {
                //存储表关系
                roleDao.setRoleAndMenuRelation(id,arr);
            }
        }
    }
    /*//删除表关系
    private void delRelation(Integer id) {
        if(id != null) {
            roleDao.delRoleAndMenuRelation(id);
        }
    }*/
}
